home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / mus / play / tracker_4_31.lzh / tracker / Arch / SBOS2 / audio.c next >
Text File  |  1995-05-15  |  6KB  |  215 lines

  1. /* soundblaster_audio.c */
  2.  
  3. /* modified by David Nichols for this PM MOD player */
  4.  
  5. /* MODIFIED BY Michael Fulbright (MSF) to work with os/2 device driver */
  6.  
  7. /* $Author: espie $
  8.  * $Id: audio.c,v 1.6 1995/05/15 13:16:24 espie Exp espie $
  9.  * $Log: audio.c,v $
  10.  * Revision 1.6  1995/05/15  13:16:24  espie
  11.  * Updated.
  12.  *
  13.  * Revision 1.5  1995/02/23  22:41:45  espie
  14.  * Added # of bits.
  15.  *
  16.  * Revision 1.4  1995/02/23  17:03:14  espie
  17.  * Continuing changes for a standard file.
  18.  *
  19.  * Revision 1.3  1995/02/23  13:52:30  espie
  20.  * primary, secondary -> primary+secondary, primary-secondary
  21.  * strike out 2 multiplications out of 4 !
  22.  *
  23.  * Revision 1.2  1995/02/21  17:57:55  espie
  24.  * Internal problem: RCS not working.
  25.  *
  26.  */
  27.  
  28. #define INCL_DOS
  29.  
  30. #include "defs.h"
  31. #include <os2.h>
  32. #include "sbos2_user.h"
  33. #include "extern.h"
  34. #include "song.h"
  35.  
  36. #define DEFAULT_SET_MIX
  37. #define DEFAULT_BUFFERS
  38. #define UNSIGNED8
  39. #define NEW_OUTPUT_SAMPLES_AWARE
  40. #include "Arch/common.c"
  41.  
  42. struct sb_mixer_levels sbLevels;
  43. struct sb_mixer_params sbParams;
  44.  
  45. ID("$Id: audio.c,v 1.6 1995/05/15 13:16:24 espie Exp espie $");
  46.  
  47.  
  48. HFILE hAudio;      /* audio handle */
  49.  
  50. int fixparams = 0;
  51. int filterout;
  52. int filterin;
  53. int filterhi;
  54.  
  55. void restoreparams()
  56. {
  57.    ULONG parlen, datlen;
  58.  
  59.    if (fixparams)
  60.    {
  61.       parlen = 0;
  62.       datlen = sizeof(struct sb_mixer_params);
  63.       DosDevIOCtl(hAudio, DSP_CAT, MIXER_IOCTL_READ_PARAMS,
  64.              NULL, 0, &parlen, &sbParams, datlen, &datlen);
  65.       sbParams.hifreq_filter = filterhi;
  66.       sbParams.filter_output = filterout;
  67.       sbParams.filter_input = filterin;
  68.       parlen = 0;
  69.       datlen = sizeof(struct sb_mixer_params);
  70.       DosDevIOCtl(hAudio, DSP_CAT, MIXER_IOCTL_SET_PARAMS,
  71.               NULL, 0, &parlen, &sbParams, datlen, &datlen);
  72.    }
  73. }
  74.  
  75. int open_audio(int frequency, int DMAbuffersize)
  76. {
  77.   USHORT status, freq;
  78.   USHORT   flag;
  79.   ULONG  datlen, parlen, action, temp;
  80.  
  81.   /* MSF - open SBDSP for output */
  82.   status = DosOpen( "SBDSP$", &hAudio, &action, 0, FILE_NORMAL, FILE_OPEN,
  83.    OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYREADWRITE |
  84.    OPEN_FLAGS_WRITE_THROUGH | OPEN_FLAGS_NOINHERIT |
  85.    OPEN_FLAGS_NO_CACHE | OPEN_FLAGS_FAIL_ON_ERROR, NULL );
  86.  
  87.   if (status != 0)
  88.     end_all("Error opening audio device SBDSP$");
  89.  
  90.   /* see if we are on a SBREG or SBPRO */
  91.   status = DosOpen( "SBMIX$", &temp, &action, 0, FILE_NORMAL, FILE_OPEN,
  92.    OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYNONE |
  93.    OPEN_FLAGS_WRITE_THROUGH | OPEN_FLAGS_NOINHERIT |
  94.    OPEN_FLAGS_NO_CACHE, NULL );
  95.  
  96.   if (status !=0) stereo=FALSE;
  97.   else
  98.    {
  99.       fixparams = TRUE;
  100.       parlen = 0;
  101.       datlen = sizeof(struct sb_mixer_params);
  102.       DosDevIOCtl(hAudio, DSP_CAT, MIXER_IOCTL_READ_PARAMS,
  103.              NULL, 0, &parlen, &sbParams, datlen, &datlen);
  104.       filterhi = sbParams.hifreq_filter;
  105.       filterout = sbParams.filter_output;
  106.       filterin = sbParams.filter_input;
  107.       sbParams.hifreq_filter = TRUE;
  108.       sbParams.filter_output = FALSE;
  109.       sbParams.filter_input = TRUE;
  110.       parlen = 0;
  111.       datlen = sizeof(struct sb_mixer_params);
  112.       DosDevIOCtl(hAudio, DSP_CAT, MIXER_IOCTL_SET_PARAMS,
  113.                NULL, 0, &parlen, &sbParams, datlen, &datlen);
  114.       datlen=1;
  115.       parlen=0;
  116.       flag=stereo;
  117.       status=DosDevIOCtl(hAudio, DSP_CAT, DSP_IOCTL_STEREO,
  118.              NULL, 0, &parlen, &flag, 1, &datlen);
  119.       if (status != 0)
  120.          end_all("Error setting stereo/mono");
  121.       datlen = 1;
  122.       flag = DMAbuffersize * 1024;
  123.       DMAbuffersize = flag;
  124.       status=DosDevIOCtl(hAudio, DSP_CAT, DSP_IOCTL_BUFSIZE,
  125.                     NULL, 0, &parlen, &DMAbuffersize, datlen, &datlen);
  126.       if (status != 0)
  127.           end_all("Error setting DMA buffer size");
  128.    }
  129.  
  130.   if (stereo) frequency *= 2;  /* XXX Stereo takes twice the speed */
  131.  
  132.   if (frequency == 0) frequency = -1;  /* read current frequency from driver */
  133.  
  134.   /* set speed */
  135.   datlen=2;
  136.   parlen=0;
  137.   freq = (USHORT) frequency;
  138.   status=DosDevIOCtl(hAudio, DSP_CAT, DSP_IOCTL_SPEED,
  139.              NULL, 0, &parlen, &freq, 2, &datlen);
  140.   frequency=freq;
  141.   if (status!=0)
  142.       end_all("Error setting frequency");
  143.  
  144.   buffer = malloc (sizeof(SAMPLE) * frequency);    /* Stereo makes x2 */
  145.   idx = 0;
  146.  
  147.   if (stereo) return (frequency / 2);
  148.   else return (frequency);
  149. }
  150.  
  151. void output_samples (int left, int right, int n)
  152.     {
  153.     add_samples8(left, right, n);
  154.     }
  155.  
  156. void discard_buffer()
  157.     {
  158.     /* not implemented */
  159.     }
  160.  
  161. void flush_buffer ()
  162. {
  163.   ULONG numread, status;
  164.  
  165.   status = DosWrite(hAudio, buffer, idx, &numread);
  166.    if (status != 0)
  167.    {
  168.       char buf[80];
  169.       sprintf(buf, "Error writing to audio device: %d, tried to write: %d, wrote: %d", status, idx, numread);
  170.       end_all(buf);
  171.    }
  172.   if (numread != idx)
  173.    {
  174.       char buf[80];
  175.  
  176.       sprintf(buf, "DosWrite mismatch, idx: %d, numread: %d", idx, numread);
  177.       notice(buf);
  178.    }
  179.   idx = 0;
  180. }
  181.  
  182. void flush_DMA_buffers()
  183. {
  184.   ULONG status, datlen, parlen;
  185.  
  186.   /* now tell device driver to flush out internal buffers */
  187.   parlen=0;
  188.   datlen=0;
  189.   status=DosDevIOCtl(hAudio, DSP_CAT, DSP_IOCTL_FLUSH,
  190.                     NULL, 0, &parlen, NULL, 0, &datlen);
  191.    if (status != 0)
  192.    {
  193.       char buf[80];
  194.  
  195.       sprintf(buf, "Error flushing DMA buffers: %d", status);
  196.       notice(buf);
  197.    }
  198. }
  199.  
  200. void close_audio ()
  201. {
  202.    DosClose(hAudio);
  203. }
  204.  
  205. int update_frequency()
  206.     {
  207.     /* not implemented */
  208.     return 0;
  209.     }
  210.  
  211. void set_synchro(int s)
  212.     {
  213.     /* not implemented */
  214.     }
  215.